package org.lql.algo.codecrush.week001;

/**
 * @author: liangqinglong
 * @date: 2025-07-22 16:13
 * @description: LCR 181. 字符串中的单词反转 <a href="https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/description/">...</a>
 **/
public class ReverseMessage {

	/**
	 * 你在与一位习惯从右往左阅读的朋友发消息，他发出的文字顺序都与正常相反但单词内容正确，为了和他顺利交流你决定写一个转换程序，
	 * 把他所发的消息 message 转换为正常语序。
	 * <p>
	 * 注意：输入字符串 message 中可能会存在前导空格、尾随空格或者单词间的多个空格。
	 * 返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。
	 * <p>
	 * 示例 1：
	 * <p>
	 * 输入: message = "the sky is blue"
	 * 输出: "blue is sky the"
	 * 示例 2：
	 * <p>
	 * 输入: message = "  hello world!  "
	 * 输出: "world! hello"
	 * 解释: 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
	 * 示例 3：
	 * <p>
	 * 输入: message = "a good   example"
	 * 输出: "example good a"
	 * 解释: 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
	 */
	public String reverseMessage(String message) {
		message = message.trim();
		String[] split = message.split(" ");
		StringBuilder sb = new StringBuilder();
		for (int i = split.length - 1; i >= 0; i--) {
			if (split[i].isEmpty()) {
				continue;
			}
			sb.append(split[i].trim()).append(" ");
		}
		return sb.toString();
	}

	/**
	 * 双指针
	 */
	public String reverseMessages(String message) {
		message = message.trim();
		int i = message.length() - 1;
		int j = message.length() - 1;
		StringBuilder sb = new StringBuilder();
		while (i >= 0) {
			// 寻找第一个单词
			while (i >= 0 && message.charAt(i) != ' ') {
				i--;
			}
			// 添加单词
			sb.append(message, i + 1, j + 1).append(" ");
			// 跳过当前单词与下个单词之间的空格
			while (i >= 0 && message.charAt(i) == ' ') {
				i--;
			}
			// j指向洗衣歌单词末尾
			j = i;
		}
		return sb.toString();
	}

	public static void main(String[] args) {

		ReverseMessage reverseMessage = new ReverseMessage();
		System.out.println(reverseMessage.reverseMessage("the sky is blue"));
		System.out.println(reverseMessage.reverseMessage("  hello world!  "));
		System.out.println(reverseMessage.reverseMessage("a good   example"));
		System.out.println(reverseMessage.reverseMessages("the sky is blue"));
		System.out.println(reverseMessage.reverseMessages("  hello world!  "));
		System.out.println(reverseMessage.reverseMessages("a good   example"));
	}
}
